iT邦幫忙

2024 iThome 鐵人賽

0
Software Development

從Servlet到Spring MVC系列 第 32

Day31 Spring MVC - Interceptor

  • 分享至 

  • xImage
  •  

前言

我們知道在Servlet中可以透過Filter過濾器來過濾請求或是對响應加工處理,而Filter是Servlet容器管理的元件我們不好從Spring MVC調用它,所以SpringMVC透過Interceptor攔截器來處理這類的需求。

0.創建module

(1) 請參考Day27 module
(2) Demo用Controller

@Controller
@ResponseBody
public class InterceptorController {
    @GetMapping("InterceptorDemo")
    public String interceptorDemo(){
        System.out.println("InterceptorDemo method invoked");
        return "Hello World";
    }
}

一、Interceptor

(1) 作用

在請求執行目標方法(Controller中的方法)前後進行攔截處理,使用場景:權限驗證、日誌紀錄、國際化i18n處理等等。

(2) 攔截器使用

  1. implement HandlerInterceptor interface方法
    HandlerInterceptor介面提供三個方法預設實作,所以我們可以只針對我們需要的進行override即可
  • preHandle:Controller方法執行前執行,依照處理邏輯返回false表示攔截,true表示放行
  • postHandle
  • afterCompletion
  1. 攔截路徑設置
  • 攔截路徑設置/*代表單層任意,例如/abc、/bcd,但/abc/bcd不攔截
  • 攔截路徑設置/**代表 多層任意,例如/abc、/bcd、/abc/bcd也會被攔截
  1. xml配置Interceptor
    於springmvc-servlet.xml中設置攔截路徑
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <!--設置排除路徑<mvc:exclude-mapping path=""/>-->
        <bean class="com.swj.MyInterceptor1"></bean>
    </mvc:interceptor>
</mvc:interceptors>

MyInterceptor1

public class MyInterceptor1 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor1.preHandle ");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor1.postHandle ");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor1.afterCompletion ");
    }
}

Demo

訪問InterceptorDemo
https://ithelp.ithome.com.tw/upload/images/20241016/20128084nF3coJgTxj.png

(3) 攔截器執行順序

如果有多個攔截器運行,那麼它的執行順序就會是他配置的順序,我們在xml設定檔的interceptor1前面在設置一個interceptor2,建立Interceptor2.java

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <!--設置排除路徑<mvc:exclude-mapping path=""/>-->
            <bean class="com.swj.MyInterceptor2"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

Demo

https://ithelp.ithome.com.tw/upload/images/20241016/201280840IqPXLOUSX.png

小結

最後以一個圖片總結執行順序
https://ithelp.ithome.com.tw/upload/images/20241016/20128084aUYriw8sAs.png

Reference


上一篇
Day30 Spring MVC - FileUpload and FileDownload
下一篇
Day32 Spring MVC - Exception Handling
系列文
從Servlet到Spring MVC36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言